package main

import (
	"math/rand"
	"net/http"
	"text/template"
	"time"
)

// action
// 1. 条件 action if else end
// 2. 迭代 action range else end
// 3. 设置 action with arg
// 4. 包含 action template name arg
// 5. 定义 action define

// 参数, 函数, 管道
// 1. 变量 $variable  管道 自定义函数

// 组合模板 header footer 组合定义模板名
// 1. define
// 2. block
func main() {

	http.HandleFunc("/process", func(writer http.ResponseWriter, request *http.Request) {
		// 自定义函数
		// fDate 函数
		funcMap := template.FuncMap{
			"fDate": formatData,
		}
		// 解析模板, 加载自定义函数
		t, err := template.New("templates").Funcs(funcMap).ParseFiles("tmpl.html", "t1.html")
		if err != nil {
			http.Error(writer,
				http.StatusText(http.StatusInternalServerError),
				http.StatusInternalServerError)
			return
		}

		// 准备上下文数据
		rand.Seed(time.Now().UnixMilli())
		result := map[string]interface{}{
			"rand":       rand.Intn(10) < 5,
			"names":      []string{"tom", "jerry", "alice", "bob"},
			"emptyNames": []string{},
			"now":        time.Now().Add(time.Hour * 48),
		}

		// 执行模板
		t.ExecuteTemplate(writer, "tmpl.html", result)
	})
	http.ListenAndServe("localhost:8080", nil)
}

func formatData(t time.Time) string {
	return t.Format(time.DateTime)
}
